--Decorator Pattern
--[[
    装饰模式：（结构型）
    作用：动态为对象添加额外职责
    使用场景：对象行为不固定，变化较大时使用

    从此开始，统一代码规范：
    1.成员方法均用大写开头
    2.成员变量均用小写开头
--]]

require 'Class'

IEntity = Class()  --实体接口
IEntity.Do = function(self)end

AI = Class(IEntity)  --AI
AI.Do = function(self)
    print(string.format('AI： %s 执行的行为.',self.name))
end

Decorator = Class(IEntity)  --装饰器基类
Decorator.Decorate = function(self,entity)
    self.component = entity
end
Decorator.DoSelf = function(self)end
Decorator.Do = function(self)
    if self.component then  --先执行被修饰对象的行为
        self.component:Do()
    end
    self:DoSelf()  --后执行新增行为
end

SeekBev = Class(Decorator)  --Seek行为
SeekBev.DoSelf = function(self)
    print('执行新的 Seek 行为.')
end

FollowBev = Class(Decorator)  --Follow行为
FollowBev.DoSelf = function(self)
    print('执行新的 Follow 行为.')
end

--------Main--------
function main()
    local ai_1 = AI:New({name = '自定义的1号AI'})
    local seekBev = SeekBev:New()
    local followBev = FollowBev:New()

    seekBev:Decorate(ai_1)
    followBev:Decorate(seekBev)

    followBev:Do()  --AI： 自定义的1号AI 执行的行为.
					--执行新的 Seek 行为.
					--执行新的 Follow 行为.
end

main()
